package br.com.wepa.webapps.orca.logica.negocio.facade;

import static br.com.wepa.webapps.orca.util.CheckValue.IF;
import static br.com.wepa.webapps.orca.util.CheckValue.Condition.NOTNULL;
import static br.com.wepa.webapps.orca.util.CheckValue.Condition.NOTZERO;
import br.com.wepa.webapps.logger.TraceLogger;
import br.com.wepa.webapps.orca.logica.modelo.Especificacaoproduto;
import br.com.wepa.webapps.orca.logica.modelo.Fornecedor;
import br.com.wepa.webapps.orca.logica.modelo.Orcamento;
import br.com.wepa.webapps.orca.logica.negocio.BusinessException;
import br.com.wepa.webapps.orca.logica.negocio.BusinessManager;
import br.com.wepa.webapps.orca.logica.negocio.facade.to.EspecificacaoProdutoTO;
import br.com.wepa.webapps.orca.logica.negocio.grupos.NivelGrupo;
import br.com.wepa.webapps.orca.logica.persistencia.EspecificacaoprodutoDAO;
import br.com.wepa.webapps.orca.logica.persistencia.search.BeanSearch;
import br.com.wepa.webapps.orca.logica.persistencia.search.HqlQuerySearch;
public class EspecificacaoProdutoFacade
		extends
		BusinessManager<EspecificacaoProdutoTO, Especificacaoproduto, Integer, EspecificacaoprodutoDAO>
		implements EspecificacaoProdutoFacadeHome {

	private static TraceLogger logger  = new TraceLogger(EspecificacaoProdutoFacade.class);

	@SuppressWarnings("unchecked")
	@Override
	public EspecificacaoProdutoTO setUp(EspecificacaoProdutoTO to)
			throws BusinessException {
		logger.entering();
		try {
			to = super.setUp(to);		
			to.getSearcher().addSearchNamedQuery("grupoList", QUERY_SelectGruposByNivel, NivelGrupo.GRUPO.getLabel());
			if(to.getUpdate()){
				to.setGrupo(to.getSubgrupo().getPai());	
				to.getSearcher().addSearchNamedQuery("subgrupoList", QUERY_SelectFilhosByGrupo, to.getIdGrupo());				
			}			
			to.getSearcher().executeAll();			
		} catch (Exception e) {
			throw new BusinessException(e.getMessage(), e);
		}
		logger.exiting();
		return to;
	}
	
	@SuppressWarnings("unchecked")
	public EspecificacaoProdutoTO listaSubGrupos(EspecificacaoProdutoTO to)
			throws BusinessException {
		logger.entering();
		try{		
			to.getSearcher().addSearchNamedQuery("grupoList", QUERY_SelectGruposByNivel, NivelGrupo.GRUPO.getLabel());	
			to.getSearcher().addSearchNamedQuery("subgrupoList", QUERY_SelectFilhosByGrupo, to.getIdGrupo());		
			to.getSearcher().executeAll();
		
		}catch (Exception e) {		
			throw new BusinessException(e.getMessage(), e);				
		}
		return to;
	}

	@SuppressWarnings("unchecked")
	public EspecificacaoProdutoTO goPesquisarPreco(EspecificacaoProdutoTO to) throws BusinessException {

		logger.entering();
		try {
			BeanSearch bean = new BeanSearch(new Fornecedor());
			bean.addOrder("nome", true);
			to.getSearcher().addSearch("fornecedorList", bean);

			to.getSearcher().addSearchNamedQuery("grupoList",
					QUERY_SelectGruposByNivel, NivelGrupo.GRUPO.getLabel());

			if (IF.chk(to.getIdGrupo(), NOTNULL, NOTZERO)) {
				to.getSearcher().addSearchNamedQuery("subgrupoList",
						QUERY_SelectFilhosByGrupo, to.getIdGrupo());
			}

			if (IF.chk(to.getIdSubGrupo(), NOTNULL, NOTZERO)) {
				to.getSearcher().addSearchNamedQuery("produtoList",
						QUERY_SelectEspecProdutosOrcamentoSubGrupoOrderByNome,
						to.getIdSubGrupo());
			}

			to.enableSearcher();
			to.getSearcher().executeAll();
		} catch (Exception e) {
			throw new BusinessException(e.getMessage(), e);
		}
		logger.exiting();
		return to;
	}

	public EspecificacaoProdutoTO pesquisarPreco(EspecificacaoProdutoTO to) throws BusinessException {		
		logger.entering();
		try {								
			HqlQuerySearch<Orcamento> query =  new HqlQuerySearch<Orcamento>(to.getPagingBean());
			query.select("prod");
			query.from(" Produto prod inner join prod.orcamento as orc ");		
			query.andIf("prod.id.especificacaoProdutoIdEspecProduto = ? " , to.getIdEspecProduto(), NOTNULL,NOTZERO);
			query.andIf("orc.fornecedor.idFornecedor = ? ",to.getIdFornecedor(), NOTNULL, NOTZERO);	
			query.andIf("orc.vencedor = ? ", to.getVencedor(), NOTNULL);
			query.andIf("orc.dtOrcamento >= ? ", to.getDtOrcamentoInicial(), NOTNULL);
			query.andIf("orc.dtOrcamento <= ? ", to.getDtOrcamentoFinal(), NOTNULL);
			query.andIf("orc.dtCadOrcamento >= ? ", to.getDtCadOrcamentoInicial(), NOTNULL);
			query.andIf("orc.dtCadOrcamento <= ? ", to.getDtCadOrcamentoFinal(), NOTNULL);
			query.orderBy("prod.preco,orc.dtOrcamento");			
			query.find();
			query.disableFind();
			
			to.getSearcher().addSearch("pesquisaPreco",query);
			
			to.setShowSearchResults(true);			
		} catch (Exception e) {
			throw new BusinessException(e.getMessage(), e);
		}
		logger.exiting();
		return to;
	}
	

}
